{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "_p9IwEC-zmUQ"
   },
   "source": [
    "# 车杆平衡 CartPole-v0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "y7teSwpgzmUS"
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import numpy as np\n",
    "np.random.seed(0)\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import gym\n",
    "import tensorflow.compat.v2 as tf\n",
    "tf.random.set_seed(0)\n",
    "from tensorflow import keras"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 环境"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 89
    },
    "colab_type": "code",
    "id": "oD2OLrzXai3k",
    "outputId": "93a4db50-6445-45cd-b76c-9013f76b766d"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "env = gym.make('CartPole-v0')\n",
    "env.seed(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "kZMR1c3dkLwp"
   },
   "source": [
    "### 用简单策略梯度算法寻找最优策略"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "PlLt4F20zmUW"
   },
   "outputs": [],
   "source": [
    "class VPGAgent:\n",
    "    def __init__(self, env, policy_kwargs, baseline_kwargs=None,\n",
    "            gamma=0.99):\n",
    "        self.action_n = env.action_space.n\n",
    "        self.gamma = gamma\n",
    "        \n",
    "        self.trajectory = []\n",
    "\n",
    "        self.policy_net = self.build_network(output_size=self.action_n,\n",
    "                output_activation=tf.nn.softmax,\n",
    "                loss=tf.losses.categorical_crossentropy,\n",
    "                **policy_kwargs)\n",
    "        if baseline_kwargs:\n",
    "            self.baseline_net = self.build_network(output_size=1,\n",
    "                    **baseline_kwargs)\n",
    "    \n",
    "    def build_network(self, hidden_sizes, output_size,\n",
    "                activation=tf.nn.relu, output_activation=None,\n",
    "                loss=tf.losses.mse, learning_rate=0.01):\n",
    "        model = keras.Sequential()\n",
    "        for hidden_size in hidden_sizes:\n",
    "            model.add(keras.layers.Dense(units=hidden_size,\n",
    "                    activation=activation))\n",
    "        model.add(keras.layers.Dense(units=output_size,\n",
    "                activation=output_activation))\n",
    "        optimizer = tf.optimizers.Adam(learning_rate)\n",
    "        model.compile(optimizer=optimizer, loss=loss)\n",
    "        return model\n",
    "      \n",
    "    def decide(self, observation):\n",
    "        probs = self.policy_net.predict(observation[np.newaxis])[0]\n",
    "        action = np.random.choice(self.action_n, p=probs)\n",
    "        return action\n",
    "        \n",
    "    def learn(self, observation, action, reward, done):\n",
    "        self.trajectory.append((observation, action, reward))\n",
    "\n",
    "        if done:\n",
    "            df = pd.DataFrame(self.trajectory,\n",
    "                    columns=['observation', 'action', 'reward'])\n",
    "            df['discount'] = self.gamma ** df.index.to_series()\n",
    "            df['discounted_reward'] = df['discount'] * df['reward']\n",
    "            df['discounted_return'] = df['discounted_reward'][::-1].cumsum()\n",
    "            df['psi'] = df['discounted_return']\n",
    "            \n",
    "            x = np.stack(df['observation'])\n",
    "            if hasattr(self, 'baseline_net'):\n",
    "                df['baseline'] = self.baseline_net.predict(x)\n",
    "                df['psi'] -= (df['baseline'] * df['discount'])\n",
    "                df['return'] = df['discounted_return'] / df['discount']\n",
    "                y = df['return'].values[:, np.newaxis]\n",
    "                self.baseline_net.fit(x, y, verbose=0)\n",
    "            \n",
    "            y = np.eye(self.action_n)[df['action']] * \\\n",
    "                    df['psi'].values[:, np.newaxis]\n",
    "            self.policy_net.fit(x, y, verbose=0)\n",
    "            \n",
    "            self.trajectory = [] # 为下一回合初始化经验列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "FWAAdXXM0M07"
   },
   "outputs": [],
   "source": [
    "def play_montecarlo(env, agent, render=False, train=False):\n",
    "    observation = env.reset()\n",
    "    episode_reward = 0.\n",
    "    while True:\n",
    "        if render:\n",
    "            env.render()\n",
    "        action = agent.decide(observation)\n",
    "        next_observation, reward, done, _ = env.step(action)\n",
    "        episode_reward += reward\n",
    "        if train:\n",
    "            agent.learn(observation, action, reward, done)\n",
    "        if done:\n",
    "            break\n",
    "        observation = next_observation\n",
    "    return episode_reward"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "FO-OnG6izmUd"
   },
   "source": [
    "不带基线的简单策略梯度算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 283
    },
    "colab_type": "code",
    "id": "0UYhQoYlzmUe",
    "outputId": "6140e7d8-e771-4fc9-c320-5f186b460cae"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "平均回合奖励 = 20000.0 / 100 = 200.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "policy_kwargs = {'hidden_sizes' : [10,], 'activation' : tf.nn.relu,\n",
    "        'learning_rate' : 0.008}\n",
    "agent = VPGAgent(env, policy_kwargs=policy_kwargs)\n",
    "\n",
    "# 训练\n",
    "episodes = 500\n",
    "episode_rewards = []\n",
    "for episode in range(episodes):\n",
    "    episode_reward = play_montecarlo(env, agent, train=True)\n",
    "    episode_rewards.append(episode_reward)\n",
    "plt.plot(episode_rewards)\n",
    "\n",
    "# 测试\n",
    "episode_rewards = [play_montecarlo(env, agent, train=False)\n",
    "        for _ in range(100)]\n",
    "print('平均回合奖励 = {} / {} = {}'.format(sum(episode_rewards),\n",
    "        len(episode_rewards), np.mean(episode_rewards)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "4Yhcnqj3j6cQ"
   },
   "source": [
    "带基线的简单策略梯度算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 283
    },
    "colab_type": "code",
    "id": "tLlVdf-Xj50G",
    "outputId": "4ab4fb1d-6e8d-4d55-91b1-b3fd81719320"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "平均回合奖励 = 20000.0 / 100 = 200.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "policy_kwargs = {'hidden_sizes' : [10,], 'activation':tf.nn.relu, \n",
    "        'learning_rate':0.008}\n",
    "baseline_kwargs = {'hidden_sizes' : [10,], 'activation':tf.nn.relu,\n",
    "        'learning_rate':0.008}\n",
    "agent = VPGAgent(env, policy_kwargs=policy_kwargs,\n",
    "        baseline_kwargs=baseline_kwargs)\n",
    "\n",
    "# 训练\n",
    "episodes = 500\n",
    "episode_rewards = []\n",
    "for episode in range(episodes):\n",
    "    episode_reward = play_montecarlo(env, agent, train=True)\n",
    "    episode_rewards.append(episode_reward)\n",
    "plt.plot(episode_rewards)\n",
    "\n",
    "# 测试\n",
    "episode_rewards = [play_montecarlo(env, agent, train=False) \\\n",
    "        for _ in range(100)]\n",
    "print('平均回合奖励 = {} / {} = {}'.format(sum(episode_rewards),\n",
    "        len(episode_rewards), np.mean(episode_rewards)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "oSDq682ugy-g"
   },
   "source": [
    "### 异策策略梯度算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "uzIiLb6bgy-i"
   },
   "outputs": [],
   "source": [
    "class RandomAgent:\n",
    "    def __init__(self, env):\n",
    "        self.action_n = env.action_space.n\n",
    "        \n",
    "    def decide(self, observation):\n",
    "        action = np.random.choice(self.action_n)\n",
    "        behavior = 1. / self.action_n\n",
    "        return action, behavior\n",
    "\n",
    "\n",
    "class OffPolicyVPGAgent(VPGAgent):\n",
    "    def __init__(self, env, policy_kwargs, baseline_kwargs=None, \n",
    "            gamma=0.99):\n",
    "        self.action_n = env.action_space.n\n",
    "        self.gamma = gamma\n",
    "\n",
    "        self.trajectory = []\n",
    "\n",
    "        def dot(y_true, y_pred):\n",
    "            return -tf.reduce_sum(y_true * y_pred, axis=-1)\n",
    "        \n",
    "        self.policy_net = self.build_network(output_size=self.action_n,\n",
    "                output_activation=tf.nn.softmax, loss=dot, **policy_kwargs)\n",
    "        if baseline_kwargs:\n",
    "            self.baseline_net = self.build_network(output_size=1,\n",
    "                    **baseline_kwargs)\n",
    "    \n",
    "    def learn(self, observation, action, behavior, reward, done):\n",
    "        self.trajectory.append((observation, action, behavior, reward))\n",
    "\n",
    "        if done:\n",
    "            df = pd.DataFrame(self.trajectory, columns=\n",
    "                    ['observation', 'action', 'behavior', 'reward'])\n",
    "            df['discount'] = self.gamma ** df.index.to_series()\n",
    "            df['discounted_reward'] = df['discount'] * df['reward']\n",
    "            df['discounted_return'] = \\\n",
    "                    df['discounted_reward'][::-1].cumsum()\n",
    "            df['psi'] = df['discounted_return']\n",
    "            \n",
    "            x = np.stack(df['observation'])\n",
    "            if hasattr(self, 'baseline_net'):\n",
    "                df['baseline'] = self.baseline_net.predict(x)\n",
    "                df['psi'] -= df['baseline'] * df['discount']\n",
    "                df['return'] = df['discounted_return'] / df['discount']\n",
    "                y = df['return'].values[:, np.newaxis]\n",
    "                self.baseline_net.fit(x, y, verbose=0)\n",
    "                \n",
    "            y = np.eye(self.action_n)[df['action']] * \\\n",
    "                    (df['psi'] / df['behavior']).values[:, np.newaxis]\n",
    "            self.policy_net.fit(x, y, verbose=0)\n",
    "            \n",
    "            self.trajectory = [] # 为下一回合初始化经验列表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "yTYSX4c_gy-l"
   },
   "source": [
    "不带基线的重要性采样策略梯度算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 283
    },
    "colab_type": "code",
    "id": "LExoG8yygy-m",
    "outputId": "96274c84-49e1-45aa-f1b5-89d6a83e6f12"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "平均回合奖励 = 20000.0 / 100 = 200.0\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD8CAYAAAB5Pm/hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJztnXmYFNXV/79nVoYZYBgYkH3YlUVZRkBBXBBFTVRiYjTGmFfyEhONiZpEE+Ob5Y2GLGriL8ZoojGJSUzcfd2i4r4LsgQFAZFNtmEdYGC2Pr8/uqq7qvrWXtXT3XM+zzPPdN+quvdWV/e3Tp177rnEzBAEQRAKl6KO7oAgCIIQLyL0giAIBY4IvSAIQoEjQi8IglDgiNALgiAUOCL0giAIBY4IvSAIQoEjQi8IglDgiNALgiAUOCUd3QEA6N27N9fV1XV0NwRBEPKKxYsX72TmWrf9ckLo6+rqsGjRoo7uhiAIQl5BRBu87CeuG0EQhAJHhF4QBKHAEaEXBEEocEToBUEQChwRekEQhALHVeiJaBARvUhEK4nofSL6plZeQ0TPEdEa7X9PrZyI6DYiWktEy4loUtwnIQiCINjjxaJvA3ANMx8FYBqAy4loDIDrACxk5pEAFmrvAeAMACO1v/kA7oi814IgCIJnXOPomXkrgK3a6/1EtBLAAADnADhJ2+3PAF4CcK1W/hdOrlH4FhFVE1E/rR6hk7P7YAveWrcLZ47vBwDYsf8wlmzci9PHHuHp+Ja2BB5d+glOHt0HizfswZxxR+CZFdsweUhP1HYr99WXZ9/fhgmDq9GnWxfl9kSC8ac31mNfUwtWbz+A6SN747xJA/DXNzfgU8f0x4DqCqzdsR87D7Rg2rBevtp24+H3NqOppR1fnDYk0noBYNPuJry/pREbdx/E5j2HsOtAC04+sg+27TuEVdv244xx/VBSTDjc2o5P9h5Cz65leHrFNnTvUoJhvSux71AriAjnThyAzXuasH7nQbS0JUxtNBxoxsTBPdGwvxmHW9uxbd9hlBQTyoqLMGlIT/zfsi2YMrQGRUQAgEE1XdG7qgyTh9QAAN7buAcvrdphew57mlqx80AzxvTrjmnDe+HYuprUti17D+H2F9di5qhaNLclkEgw1jUcwPpdTRjYswJlJUXYd6gVh1raUVxE6FVVjq17D2HuxAF4/aOdGNu/B84c3w+PLNmMYb2rsHDVDkCx5Oqh1nbsPtiKAdXq749OSztje+NhtLQn0K28BF1Ki9G9S1p6Rx3RDZ86ur/7hQsB+VkzlojqALwCYByAjcxcbdi2h5l7EtETABYw82ta+UIA1zLzIktd85G0+DF48ODJGzZ4ivsX8pzP/f4NvLt+D965fhb6dOuC0259Gau3H8Cq/52DLqXFrsff+txq/GbhmtT7d68/Fcfe+DxG9+2Gf18103M/WtsTGHn90xheW4mF15yk3Gf19v047dZXTGULPjMe1z38H5w3aSBuPv8Y1F33JABg/YKzPLftRlt7AiOufxoAsPgHp6JXlb8bmBtH3vA0Drcm3Hf0iabZKk30jP45Xnz323h1zc5UnUZU9Rs//+88sAwPLN4cvBMAvnriMNz58rrUe7d+qLar9lPt/6mj++P/XTgxQC8BIlrMzPVu+3meGUtEVQAeAvAtZm4k+zNTbcg4VWa+C8BdAFBfXy8rlHcSNu85BABoa09e8g27mnwdv/NAs+l9QvsVfdRwwFc9+nGbdh+y3Ufvo5FmzXK19iNKEoZm2xPR/zTCiPwpR/bBCwpL+9XvnoxBNV0BACu3NuKM37waqP4DzW2oKi9BWztjytAa/Ourx2Xss6PxMKbctNC2jl0HWzLKKsuKcbCl3XM/jCI/oLoCr193SsY++k3++atPxIg+VbZ16fsZ+fhn0RkGXvAUdUNEpUiK/N+Y+WGteDsR9dO29wOgX/3NAAYZDh8IYEs03RUKhaDyZWdftMUgiKzoZZHWfhwCrGo31ywgB8M1vY+XnWz49r+WAQDamVOftZViuw0aqmvjdowTbufTpTT3gxe9RN0QgLsBrGTmWwybHgdwifb6EgCPGcq/pEXfTAOwT/zzgk4IDdCOD1tDkqDuBf1Jti0RvetDx9i3MG6QbGIUwzDXSH8yY+aU/95KSZGzbCUUH1pZSXAxtuuHToUHlyMAPH7F9MB9CIsX1810ABcD+A8RLdXKvg9gAYB/EdE8ABsBfE7b9hSAMwGsBdAE4L8i7bEgGFD9qKPCqeo4Lfp8xCiGYSx6/VNNsL3AFhc7N6D6TrjdHJxwexjwMrYEAJXlHZdD0kvUzWuwN8RmKfZnAJeH7JfQSfArl2FExEjQG4R+VByuolQbRos+x5w3dp+/sTyElyRFgtm2rWKXL4HqJlzicnMIg1eh97pfHOS+c0koSKzRXl51N6qfq5f2VPskNBFRDdRGhclHn1s6b9sfs7sm/FVKsL1fXVWuh3ACgMqrVlocn9R59f+XxdgHN0TohaxiF60V1HINKoSc+u+vAv1JoC3BKWGJGrNFnx+YfPRRWPQJJx99ZvnFd7+NaT9LRuK0K103YQZjozEvwowThEWEXsgqdvM2wgp2VP0w1525j+4VWLm1MSUsUWNs1c88l47EPBgbnoRD1E2RYsO76/eYjrVSYmNNX3DsIGW5EbvzGV5b6XqskY606HNihSlB8CpnUVlXumA7RYioNDYbwpvL4m7rozd8jm5RKk7o557g4NdaNXxSauOj7x1iMtpjV8zAweY2z/t3pEUvQi9kFVvXTbbFzYuPXlEWZ5SPqt1c03xbH33Erht2sOjdSKgGY334+zOw2aWqvARVPiJpwsTyh0VcN0JOEKcLRt1esOPa4wufT5Fr4u4FU3hlBM6b9gQHFkZ11I1a6sL47r0yrLc/F08ciNALtvzm+TWou+5JNLd5nzruFauYeY66sfwug4qil+hI1U0kGxa98R6UL6JvirmJJI6eQ7huFBOmbITeLSY/Ch7++vF48soZsbfjhLhuBFv+9MbHAICDze0oL4kpBjikkAUexPU0GBvsuLCYUyDkh9JH77oJ7utXD8Z6j+CxEvZ0qruWobprGQDguatmxvdbckCEXrAlqx5Fz3H05l4FDsv0so8qjj4bBn1eWvTGmbEhQhm1/05RN26orpHdzNjiEDNmgzCyb7estqcjrhshJ/Aq2FYNCSq8QV0w2R6MzRfIoCRhDAQvKRDcUA3G2kXd2JUXGiL0Qlax++3G6YJRHxhsJ5WIRI3xnPJF9KPy0eu0O0yYcoKZ1ROm7Hz0Xlw3UeXd6EBE6IWcIHDUTcjjnJ4kOsx1Y+pDfkg9RRx1EzS8ktn9qcuYbTIbUTe5gAi9kBN4FTTrzzJweGUux9HnYwoEw+tQ2qmdcFDXDUOd68aIMX98IVjrXhChF3IC7zNjLceF9NH7nRmbHYs+d5Oa2VHkkAPhlvOP8V1fghlBxkmZ2TWFtDGLpJebSSHcCkToBVfidB+EDR/Mussny3H0Udv073y8O9L6dJwWHtEXgvdD0Dh6hvqpy3jdzELvu4m8RIResCXOx9rgE6bMfQqcV95LHL1in2wsOBJnC5fe+26MtSexfm2CuGAS7Jx3/ufnjbc5Tm06GC9l1zJ/Fn0h4GUpwXuIaAcRrTCU/ZOIlmp/6/WVp4iojogOGbb9Ps7OC/mL9eeYzTTFB5vb8J0HlrvXrSjL9zh6txvcYG2Bb78YBdMqnn6s5nU7D+KFVdux+2CL43GfP3YwLp0+NKPcy+d1x0WTU6+96Hwh3Au8WPT3AphjLGDmzzPzBGaegOSi4Q8bNn+kb2Pmy6LrqlAI6D+ajB+k5wlTlsMCCOF9b23Am+t2ue6n9tFne2ZstLjdqG6aq7aU3XBKU+w3Z82l9y7S6nQ+zs44UGYd1fYtKy7C4F7pm5k3H33+K72r0DPzKwCUjj1t4fDzAfwj4n4JOUQc0hZQ5zNUJIjwGn/bfp8kspOmWP06krpdztdpAPTUo/rghk+NUW5ziqMP6gJ0E+EobsTiuvHGCQC2M/MaQ9lQIlpCRC8T0Qkh6xc6kDh/AkGXEowCrz9up4VH4uS9jelFNKLOdeP2OTstjvHHS45FnU0mxqjj6IFgA6V252dX7ilLcQHcC8LmurkQZmt+K4DBzLyLiCYDeJSIxjJzo/VAIpoPYD4ADB48OGQ3hDiJUoR1Eci06L3G0Vty3QTom2dRUtStmnUZNVf8fUlsdbt1v6IsWMIto2BSRCEeQdIU252eft7W75nE0btARCUAPgPgn3oZMzcz8y7t9WIAHwEYpTqeme9i5npmrq+trQ3aDSELxJFBMao0xUFcN8UeXTfq6I3sBrZn23XTtSyY7We+eUaDq4/eJYzSVG5z3h25GEg2CXPvPRXAKmberBcQUS0RFWuvhwEYCWBduC4KHU4s2pasNKyQBTlcteaoV9xmXfph+ea9WLTeOa49+qgb5+1dA1r0RqKykoNcpqRrzd7lZn2C6yQ67ym88h8A3gQwmog2E9E8bdMFyByEnQlgOREtA/AggMuYOZ4ZGkLspCJkYqg7w6IPWE8Qi97rakhxR92c/dvX8dnfv+m4T+Q+epftxslEQYlKO93GUj47WbGwt+UEdSEvJkJpMeGGT4+xbO8cSu/6nMbMF9qUf1lR9hCS4ZZCAZGVyaCBc934byvXB2NNfYi4PbcbVRQWfVTi6WZtjx/YAz846yj89MmVqTLrNassK8H+5jYkmLHmxjMz6vAWR5//NwOZGSt0CBmDsQF99EGeBYq8+uhV8dh5knxmx/7DWGKI3tFx636pQ9SNV6LSRS8uNqsIv7VuN/Ydak29LytJno/djObOYtGL0AuuZGMw1itRRN2E+XFnI+omCs78zauY+7s3OrobsWO9F1x232K0tqev0dgBPQAAcycNsDlehF6ImR2Nh7FxV1NHd8OVSMMrU37/aOLogxzmlIDLre58cd3sPNASuM0x/boHPhZQW/TrF5zlux4vi7y4CfXAnhVYv+AsfOro/jbH2x/750unAJDslUJIpty0EDN/+WJHd8OV7AzGBmslyIpPRnFwdt2ofPTq/bc3HvbVB6/97ojFwd3SA/ftXu64PaoJU14+Ijfvjtt2J/+7fmx5af7LZP6fgRA7cfil0xNY/JGRjz5A215jp/3E0U+9aaGvPtz1qreo447wFLlZya9dewq6ldvHcfgJWfz0MWpLG/B2k3MbKHU7F6e+6jcsp9nC+UL+n4EQI9os1khnxiYJ6rqJIurGq+tGRVRx9O9vyZgsrqQjRgTcxLO0uCg1yBnkeCO3nn8M3rthtnJbeYl7BJC7kKu39+vRJbndQelbtYtdHkHIaUcTNgWCILjS2p7A/sNtqKksS5VFFUcf5GnDq+smzhQIuThR51unjgQQPv+Ln1MrKS5Cj4pS5bYuHlwm7q4b9Q4vXHMSWhMJbNl7CAAwoLoCn2ivu3Upwf7DbWhp04Te4aaWL4jQC66E1bZrH1yOh5d8go9uyoxjTrcRLL4yyOBomDj6A4fb/DcYpg9Z9N1065IUXC89c7LajZvsrHUjdmIdjUWvLq8oK0YFitGtbwmevHIGGvY348t/Si7K8up3T0aCgdfW7tT6kf9Cn/9nIMSGXYSMX/5v+RYA5lhmJ4u+ua3d80pOQfrm1ZpWaayXPPZe8OrdyKbrRu+SSjx/cd7Ryn2V9RiONz7FOe3/0rdPwk/OGWsq9yKwbrH2btuJCGP790ClYcyhe5dS1FSWobm1XetH/rtuROgFV8Ialbof3LgOqJOPfvQPnrFd8i4aH33wFAhR4d2ij68PVnRNVPWtjyXSJurw87relRinxbzreIl26d7F2SnhtZ/G3fSbQ0t70nXjNB6RL+T/GQixE6XW2LsizOUvr25Q7hVJ9kqDlRf2aWVAdUWg47z76MP1z4/rR78BqsQxc3nA6AcZSiwfyoBq92UNe7o8MTitO2tE5YqqrUre3Eb2qfJURy4jQi+4EtpPrP2GjKIcNE2xlUATpiKs+9i6ngF6YL7Z/PPdjfZ9sHTisr8uRt11T3pux8/n2qdbUthUIp6xapT3aj1jDXudMrTG9ZieXdUDuTpeb0iq3WaP6Yv75k3Fl4+v81RHLiNCL9iSDoUMzoOLN6eiFxIMg+tGq9unwme4WiJyK6nw0reglq3Rgrz/3U2ej3vm/W2+2vHzxDNn3BEA1BOmrOe5ZZ+/CWJeKHGbqaWgR4WzRe/1yUl9cyPMGNk7VFrrXEGEXnAljEH/p9c/Tr02W/QWH73H+jInTPnvHJteO8yM9dSfgELvcb+wbjM/x+vnohS9kP3wQkmx/1a6ufrovdVZAFruiAi94IHgcmPyhxsmG8393RsmsQ96MwkygSnKkMWgAmHUnyUb9yozTQLhB2MTzLjntY8x7of/DlVPNlL1BpmB6haZ43UWdFRpG3IVEXohVow/n3Zm0/tdB9OJt4IOino96sNt+zH0e09i027vSeS8iGzQpeis6YD/qblvMhdNDzsYC/zkiQ9woLkNx/3MW5oGLz76IDzxjRmO24NEt7inQPBaj++m8woResGVMFpj/CFa/cUf7zzou43M8EpvB/7z3U1gBv79/jYft5R4Yhs37W7Cn15fr9xmnT4QtgfGz3yrR7+6ShyjiLIZN6CHowUeNBd+hUOKAq9PIp1e6InoHiLaQUQrDGU/IqJPiGip9nemYdv3iGgtEX1IRKfH1fFcYV3DAZzyq5ew60BzR3clNsKIjVE0rEJ/sDk9yzT44uD+j/Palpf9vE7sMvLIkk9C1+c1+2WCgVKfvu+4LHo3/PZTx2lVLK83qELPS+/lFnovgDmK8luZeYL29xQAENEYJNeSHasd8zt9sfBC5c6X12HdzoN49oPtHd2V2Ahj0ZvyyljqMQ3OBs92k6Vj1ESV+0b/mKw3Q7vqWz0OTjCz72gWdRy9ryoCEXRiktM6t2GibgoJ10+WmV8B4HWB73MA3M/Mzcz8MYC1AKaE6J/QgUSRAqHI6roxWviJIGmKzT/IIDprPEY1CMfM+PYDy/D2xx6+9hF7dzKE3qaBtnZvDc/78yLfNyO1uyN+ISwNEF4JwDYpGpBMmuaFAtf5UD76K4houeba0WeNDABgDArerJUVPIX8PQnno0+/TjBMwmgUoMBRN0GE3vQ6s4IEJ+P/731jva+6VLS1J3DdQ8uxYddBlz2TZLhubBrwKvTvfLw7NY/BKyorOBuJvYLGq886qo/ttoumDvbWdiH/gBFc6O8AMBzABABbAdyslas+LuU3kojmE9EiIlrU0KCe7i7kBlG5bqx+ZbeB1FXbGvGLZ1Y57hfPerY+hmtd9l2yaS/uf3cTrv7XMk/1eR2M1fOwxIHKjVHh4AfvaJwGcZ3cOkayET7akQQSembezsztzJwA8Aek3TObAQwy7DoQwBabOu5i5npmrq+trQ3SDSFmdLdGKNeN4RvGDLPrhi3bLHzu92/idy99hAPNbdi4qwk3P/thxj5+b0LM0SYKc3uiKFL43tWSoiV+y7gZqutti2oFFABXzhqJuy+pT71XCb3TgKcf7p8/LZJ6jASN1jFS2DIfUOiJqJ/h7VwAekTO4wAuIKJyIhoKYCSAd8J1UehoorLorb5iU9pilQtF205E+Mpf3sX/e2FtxmLqXqf4p9M5sOuNy8/puu2rn7/XKBmv/vTWtujuVlfPHoVZR/VNvb92zpEZ+ziFMPph4mBvuYF+fPZY9500gkbrGOn0g7FE9A8AbwIYTUSbiWgegF8Q0X+IaDmAkwFcBQDM/D6AfwH4AMAzAC5n5vbYep8DdMTizfmEUxy9U5IzK80+/cyZ/Ui/dmvLz43NzXWjT6hatnmfp/q8DsZ6jboJwuBeXXHPl+tNZdl23Zw6pq/7ThpRpBEucJ13X2GKmS9UFN/tsP+NAG4M06l8pJC/KOEsemM95pmx5vBKb32wBmYEirpx3R7dlCo/luIba3dix37zfAxb143HwdigWKOR4lgg+1efO8Z2m9f0wkA0rptCt+hlKUHBFv27/8HWfRg/sIfzzjaYwyvN24xGqfcBUPMPMkg+ejd8Velj30SCbSNLiIAv/PFtZfX7D7fisaVbTBEkrTEOxiY7ZO1f9EL42ckDbbf5iYKx5rEPQoHrvKRAENy59qH/BD7WaWZsO7P3WarQ/fWW8kCDsemDWkNaxkbr/0Bz5nqyxnMOMrmKmXHDoyvwg0dX4N316sRncWD8mI88olvW2k2170N5o3HdFLbSi9CHJJtLveUjJh+9xQhlj64bNtwQrMab58FYhx/yjv3pHDBPLt+KQy3eh5WMzV/1z6UZ29sMjzFBnz50d44xHj6OJxkj+ud1wsjeeOZbMyOt+xunjPCwYIj3+qJx3YSuIqcR101EFHqa06BYLXqyceU46RYbtls/50AJEKyx6tr7xRv24PK/v4dzJvT3XJdRcFWpho3RNovW78H0Eb19uQnY0IZ5vMN7HUHQ24qjnWtOG41rThvt0r73D2mSx0geJwr99ysWvRArTrluzLNAHSZFOZr7/vtkHWzVhbTxcCsAYMveQ97rMlS180BLxnbjOV6k8MG7N5B+EjL692O36A0LurtR47JuaxD8zJI9okcX3OwwsOsF/TvRrbwwbV8R+pD4+bmt3NqIPQczxaCQMRpmVh+10XXzwZZG7G2y+WwMhzmFaHrFdr3aGCJ4rOd8uNVftDGDU3WYFzWPF/Jh0b93w+zI2/frSgk7gaxKE/irZo8KVU+uIkIfFR6+mGf85lWcc/vr8fclBlZta0RTS+ZgoxtOcfRGa/eGx97H+Xe+qayDwambQtB87ekJU6r60+34xXhKqkVIrLlrGvar01nbfX2Yja4b49NR3Ba91k6IW8rxw3sFPtZvuGNbkKRHBrp1KcW6m87EpTOGhqonVxGhzzIbfaxw1NEYf2pzfv0qLv/be77rKHYQJ+tvc/X2A0oBYzaIscc0vhkYLNRMi55d65o/c5jNlvRBqthvq9DvPNDsc0JW2s+/2/A0GFLXXEkt4h6wnbU3noH75k0N3L5fofc689ixzQIekS1Mh5QQC0HC+zKyV8L4Xi3qGWWGcqtwBnLd2LTpVJVdrLapO4pdrP3zE9Gjo7tu/vsvi1JlcQ/G+nHdqPCaHtgOvxmLw4bJFjpi0QueCRJqbM1eaTczVkfpWnGIRQ8WdaM+Su+PKgLDTujdXCjWeU1NLe2+o25Uc6PiH4zV2+8YAfVr0QdZ6aszIUIveCbINHEni94qYGUlRWrXDdKCk7E5Sove4ZhiGxPTdTDWMkjYZDMYq5psBQC7DjQrP5NsxdF31DyRKHz0Q3p1jao7eY+4bjoRTS1tKCsu8rHqDlne+2/T2Udvfl9eXGRj0acFJzPplz8YnHGQXqej68ZDhkR9j8OtSau9vKQ442a2r6kFuw+2Zhz72FJlNm9c97DNrORsuW5c9uvTrTyW9v26y4fXVpreD6qpwFNXnhBhj/IbsehDkp7Ik/uM+Z9/44q/Lwl8fJBztFr05iySZhlJWvTp97rf1ZhY2PqI7tXidJoQw4pXVlQRNdb29XM7+kfPYsqNC9HansgI+7vhsfdxz+sfe+ixM7EPxmr/7VxT00ckI2qeu+rEeNr3aVWcNvYI05KCtVXlqCzQmPggyCcRknQOlnyQeuCZ97cFPjbIOTrnozfvW1ZSZPIJp1ZRMhxm1Z1gg7HqeP5gg7Hpg/SbSUt7Ai2HEhh5/dO+++aVuF03+iSoMf27K7ffdXE9tuw9hB4uqQyyyZFHdPO2zm8nRIRe8EyQ6DOn2ZwZrhub5FTOUTf++5QRXmmtS3Gedhb98NoqvLpmZ/KwLN7r43adD6utwkNfOx7jBqiFvrK8BCP7Zj/ZmROmp8WO60ZOIq4bwTNBLHrjEW4+eqvrJn0coP90M3z0Pi1bY0y+uX6Dpa+o0s6iv+a0UanVl7yuTxoFUVj0fbuX44Vr7F0vk4f0RHlJ7q4Va6XQc8qHQYRe8EyQn5E5vNK8zSpW9pEtbBiMDdAJuK0w5e66sbvJlZUU4Z3rZ6GyrBi1VfEMTCqJwGQdUlOJYbVV4SvKEfysItbZ8LKU4D1EtIOIVhjKfklEq4hoORE9QkTVWnkdER0ioqXa3+/j7LyQybcfWIbZt7wcS93B4ujTrzNTIJj3LS6ymTBlKIsk102Gj95Sl4fzHFRTASB5I+vWpRQnjq4NlG8+KEEt+nONmTkLzAAu9AyUYfBi0d8LYI6l7DkA45j5aACrAXzPsO0jZp6g/V0WTTcFrzy4eDPW7DgQS93B4ujtV5iyul2KiJQTdBiIIOrGHr1Kp0k31i0Pf2067rhoUioXehER1u44gLrrnvTWoZAEfbI5z7CqUy7KYhjvi3hu7HEVemZ+BcBuS9mzzKzP8HgLgP2aYIVOJ3pEDOu6Sa4Zaz84W0RkY9GnC73G0V9yzzv4+TOrlNsyB2OTBfqkG+V5Wg6q7VaOM8b3S723G6x1o1uXYPEQbmMTY22iZSoM4wi5KIwvXnMS7rx4cqBjjUZFJ/pZeiIKH/2lAIxxZEOJaAkRvUxEnWbGgttvJu5sg3Fg7XOw8Mr0a7eZscVF5DBhSu1Ht3NhvLy6AXe89JFym91grG7RB7lSfhazNhJ0Uo+bRW934zFGQQW9OcVJXe9KnD72iEDHGs+mUPPKByXUp0FE1wNoA/A3rWgrgMHMvIuIJgN4lIjGMnOj4tj5AOYDwODBg62bC4481PkMwfObaCp5jH0cfaZFb39D9OO6sbPk7Q6yC91UtQ8AZx+TuQJV0MyHg2qCTdN3MxzsNht7aTf4na/ol2DasBrc+vkJHduZHCPwlSaiSwB8CsBFrH3rmLmZmXdprxcD+AiAMpM/M9/FzPXMXF9bWxu0Gx2OV/3OQ53PEOIgg13WmbDkMDib9NFn4pQCwcgVf0+mUbaz5PU+ZFj0Wkm7k+vGgGqpwaAWvR1njne2at2+T6qxjl989mjTU5mHrA55hX5uX5kxDLUxpWbIVwIJPRHNAXAtgLOZuclQXktExdrrYQBGAlgXRUdzHbffeT66bqwGbujslZbPYPX2/Rn7qtMUO/joDe+fWL7Vth9OoXeDoTCTAAAgAElEQVT6e6+LV6gGpcPkMp9SV5NR5ram6l2vOP+sVJ/j+fWDLBZ9YSm90+IynR0v4ZX/APAmgNFEtJmI5gH4LYBuAJ6zhFHOBLCciJYBeBDAZcwsc5KR/S9fU0sbvv3AMvvl+TyQ4aM3vH5w8WY8smSzax0mH73FJ//WOvNXo7iIlB+U0UfvNjM2qEsj2T8H141xk3LmrH29R/VTD4zqfOn4IRllbhK8dNNex+12p2K8RxWc0Kdy6IvUW3H10TPzhYriu232fQjAQ2E7VYhk+7t3/zub8ODizagqL8GPzh4bqA5rn42W7LcfWAYAmDvROeDK6O65/cW1WLfzoO2+RUXu4ZWZwm5+78UotwrBDx5dgXu+fKxjFkvjMSqL3sl1c+6E/li5NWOYKkVJDL5yO7EzXo/CE3ottXIH9yMXKazRmA7Aq/WQ7QUc9B9xmKnyGT76ALpgPG8nkQeSPmNbkWXDa5v6AfvzNQqcdY+lm/bip09+kLpJuH1mKn10ct3og9DnTOiPakUSsFKFszyuJHnGagstZYBbxs3OjAh9RLj76LPTDx1d6HW/c5Avf6aP3r8w+Gm2iAhP/CfTz26sIjNyB5b3Lq4bmz49/N4nWLWtMaM9u35aaWlTLAOl8cVpQzBjRG982+J3v+OiSQCAirLMfDJhJdj2hmeo2C5/T74SdvnDQkaEvkDRhb5dz+nu0aVx1ysfpRahdvLRx0FREeGGR1dklBsjZax+frtQSSteMhvqi3/YrXKlqktn8Qb79XS7dynFfV+ZmhFKqU+4qq4oc+yvl3Ijm3Y3YfV29exo45NNoS2GXSSuG1tE6LNER1n0ugXspfmlm/bipqdWpfzvTj56r/g5bTs/t1OuG2v91u27DjTjb29v8NGLYBb9xt1NpvcXHDsIR3TvgteuPdm1vZ6VZnfONbNH2YayerkCF/7hLdttpsHYQnPdaKcTd67+fESEPktk20evP5a3+3Dd6Cs67T+cXOouEh+9j9O2XcUJ6f67JTWztnf539/D9Y+sMI0PuH0Wqugb4yEqob9p7njT+7relXjr+7MwsKd6QtQFxw5Kve7ZNW3RTx7SE9+YNdL2s/Zys93XlLlUoY7JdVNggfT6zVF0PhMR+pB4njDVwT56P9ilBF61bX/mzm51+bnB2eiOMYe8e9SNuWDH/mZtP+/9cMtCqdLacycOML2383/rVX93zpGpMmMe+zZrXggPbVspdhDwxkPpRcgLbjBW99F3bDdyEhH6iHCbNZrtL1/KdaM5tb20b/3dqx6BN+xyjpwJw4urdijLTfnorSkQLPtm5tNJFujT/Y2zbO1Qaa3xEC+ubTsR/c7pyQHZKptcLAdb2h3r9TI72WmQdWjvSk/75SNfmJpMpVI/pGcH9yT3EKEPiVdDMdshX5muG+/H6ruqjml2iC5xrMwDTTYiZ+yH1dp+1rIGrvVzbtPcUUZRc3vKaHW1qt0FstRmWcQvThuC9QvOQpnN9nkzhmpt2LXt2rRjfHxtt3L84KyjABTeYOzxw3tj/YKz0L+6oqO7knOI0EeEa3hldrqRQrdgF2/Yi32HWgONEagsegKwzGVWppEozvvVNQ2p/lv79FGD+QnDzqJPR2Sw603PKVTSWJcVY7Kz2qrMSBovXDglaZXa3Uw8Cb3LTvpnWGiDsYI9IvRZwo9FvftgC9Zs9+8P/6ghHVKnT8nfeaAZX7rnnUBjBHaHnHP7667H7jvUilXbGiN5krnpqVU43JoU34zwSgvWG0GQMQqV0JtnxqqPu+3Cibjl/GMAAMcMqvbV5qTB1abF0e0k2IvrxslHD6RdU277CYWDJG2OCFc986A3OxoPo50ZZ//2dTTsb8b6BWf56sOsm19OvTZanV4tcOvPXmXRW8MIdx9sQU1l0nplZizfvA/HDKrG5+98E6u27cd/nzDUY++94RoxYxOVYzzO7VI0tzn7yZ0GMT8zaSDOmTDAd3qBh752vKf9vFTrllJBH7cRi77zIBZ9RLi5Rry4TqbctBDH/ewFNGiRImEIM4XebpEPAJj350Wm98fe+Hzq9SNLPsE5t7+Op/+zNRWhE/XQhOu6rJbNehSLsditCrdxCLePNkgOGSIyXTN7H715w76mVmzbd9hU5ta8btEX2mCsYI8IfUS46o9lexRi7tyeucEtew+5HhPk3mDMJvnJnmQbyz/Zl+6H/ypd2nPebvXUNB5OhhMab15uN11Xoc/Caqt2Nwtr6fELFmLazxaaytws+mMG9QAATJTolE6DuG4iwk3o9x4yT2IxWsJxYO3OKQa3jlcGVFfgEw83CJ1qzYWz12HCTlj8um5Sx5nqcG5DtdKUacJUFsyjmq7qwVzrzVgVjun21HPS6D549/pTZXGOToRY9CFhy387Tv7VSzH3xEIEpvToI7r52r9SS86lz6wFonfduE1vt9seYEzWlmxMNCqxSXBvdN3Y5c8/3Oo8xgBARL6TIUIfklxNiRom5ULQI/X4c6MQRp36wWldV8D+xhI2/4nxPDrStW1s+zcL1yj30V1Pxw3rlY0uCXmACH1E+Jpin7HAdfQ3i2BVmhXMb7/0sETT5KSIT82tPltBNxQH+byNh8SVK94LxratQt/WngAzo5fmQps+QoReSOJJ6InoHiLaQUQrDGU1RPQcEa3R/vfUyomIbiOitUS0nIgmxdX5XMKPdEz48bPmY2N4KIiiTr9V6JakccZl1JkE3fzP9jqvDcY67OOVjswR49TyiOufxpX3L8XEwckY/q+fNCI7nRJyHq8W/b0A5ljKrgOwkJlHAliovQeAM5BcFHwkgPkA7gjfzTzAh3jsb24zvY/D+RNFnX4FsUVz3Ty4OL2WrJurxS9u9bneWDi8M6kjXTd2TxN6GOn/LduCRALo27284FIcCMHxFHXDzK8QUZ2l+BwAJ2mv/wzgJQDXauV/4eTz8VtEVE1E/Zg5c+mgAiKONMSJBAf+sYZxBwU9VDWjNGqL3t11Y1Oude22F9aG7kNHWvSqZQcBYOeB9CLwCWaZDCWYCOOj76uLt/a/j1Y+AMAmw36btbKCJoyeMbMyPW0YkQxypFUb/NahEvr2BCvXSQ2K61KBtuGVzse5TXLKlSF3uxzy97+7EQDQu6ocCe7YcQQh94hjMFb1Dcv4nRDRfCJaRESLGhoaYuhGdvAaXulWhyoni50/+nBrO+que9LkIsmoM4KbRNDBWCMJjnYJQjcfva1F73IqrkJviqPvOBG1mwy1vTE5Ae/44b3AzFmJ9RfyhzBfh+1E1A8AtP96MvHNAAYZ9hsIYIv1YGa+i5nrmbm+trY2RDdyg2wOqOprut787IdZ7Y8bLRE/lagIGnXjdpyfdAAd6fout0lv3KhNyCsrKUKCOcO99Mcv1cfeNyF3CSP0jwO4RHt9CYDHDOVf0qJvpgHYV+j+eSBk3DqrBcpu4FEvddKbjnA1qPqbSHBW3Qj2gh7WdWOMo8/O+ehhkkaKiHDiqEzDaN+h9PKPCc7s45j+3ePppJAXeA2v/AeANwGMJqLNRDQPwAIAs4loDYDZ2nsAeArAOgBrAfwBwNcj73UOEspHb5Mj3d46TZY7CWigtMTs/N4N1X2pPWLXjXsfgs2M9WPRZ+u+9ejl03H17FGmspJiUt6y9h5KPuU1tybw+LIt+HinOU+/uOw7N56EnpkvZOZ+zFzKzAOZ+W5m3sXMs5h5pPZ/t7YvM/PlzDycmccz8yK3+vOaKOLVWV2NXe51LwIc7AmDTQ14reOiP76Fg81tSp9+gjmrImMbR+/yoRUrnNrTR/TCZyZmxhFky6IfVNMVF0wZZCorLiLluaz4pBGAeU0CI4W2PqzgDxmyiYiweq903WQ5RDJoc6+v3YV3Pt6tPIcnl281hf7pjOpbFawxF/7r3neU5W6nprLovzpzeGpZOqNQZlM0rWGSxUSBrpPIfOdGhD4qHH59XqJXfvJ/H2SUGYVz7Y79+M4Dy9CecF8Kz3qsV6zuDT9VdK8o9ZU4LK7BYtVNxUt7Kh89EXDZScPx5ePrcMlxdenyMB30ibVfRUXkeG3tNkm4ZedGhD4kxqn1dnhJxKUKlTRmJ7zi70vwwOLNWL19f8rSd/rtBrPo2fLe+7GLN+x2DPfsaNxufA0HMtcHIBCqykvwo7PHokLLzAlk16K3hnKWuAi9HaLznRsR+ohw+u25uWDstt/01ErMu/dd7Nh/OPXjLiJK3TicfrxBxMA6J8CPn/+mp1Y5btfT4k4dWoOfnzc+0CpMYXD7OFRzAGxXecrir8Z6UykuIscnJ7vrLj76zo0IfUQ4uWfcFrQ+pFg8AgAeXboFC1ftwE1Prkz9uIvIm4j7caMcamnHz55aiUMe8pgHZUy/ZHjfBVMG4fPHDkapId/6Uf3SoX8DNJ941ATJuWMnjR3loz/1qL748dljHR8fW22W4BKZ79zIClMR4SQjbsJsJ/Q65SXFqTqIKJUuwWlJO7tFKVT88dV1uPOVdfhga6OpnFm/sXiuyhbdgtdF0m4qf1wzOgNN3LL5eLP5MGL8PP54SXLSk9OTVmu7jUUvCc46NWLRR0QY183zK7c7bu/RtTRVfxF5s079CJtuybdpIqEfygi20LUKazVGi974NBTXeqyB/No2fenIqBvA+carmp0M2CdDEzoHIvQR4WjRuwjzT57IjLgxUlZclJoA49VH7yc0U99XZU1HJWp61IdeX5nNUnlxEeSpxNZHn0XNVN1ondyEdovOZ3tMRMgtROhDkrJ+HX58YXOy3/5SOrVuEVE66sbhmDc/2mW7bcveQ/j3+9tS7/UbkS7CKdcAR2/R6yJp57qJi2AWvV159vquCosM8nWyS4YmdA7k6ofEST827mrCz55eiW2NhyNrgygtzEYRsN5onlhun17o3Ntfx1f/ujj1Xn/at1rvjOjymuviqP8vtV38OpLmUpw8OpkXxs+YRbovdq6bUF0KTRCzQSz6zo0MxobEaWBs5i9fBADc89rHkbapekLwY7DusDzepwd6M+uMahDPalBmw3Xzg7OOwuQhPfHihw2ereDJQ3pi8YY9AOxvOh0RqvjNWSNTr3N1QXohdxGhjwin355dJERQVK6bQJltOJlZMuHgCorKEtStY72tbAwOHm5tT4myV/fZRVMHp4XeZp9s6/z6BWeZ3ovOC34R101I0hEq2fn1MRtEi4zl/tvX69EXPdFF3Rh1E5X1WmQR+nMmxL/oWFNLe0qUraGjdljdZCo6Op3AhVMGAwAuONac8EwiawQ7ROhDkppFmiUri8Fq102AuvQng7T/2iwU7QmOTDz0BwP9czr5yD72Oyt474bZvttsamm3vVGdPLoWr3zn5Ixy8+eYm8L5hamDsX7BWTh7Qn9TebYjmYT8Qb4ZEbF132Hs2B9u0NULxkVKjDIUKOWBdkh7KurGvD3BbDto6herRW+Hvv3e/zrWVB5Ect0moqlCUI39sz4lnTdpYIBexMfxw3tj7Y1npPz3varKU9ue/uYJHdUtIQcRoQ+JrgX3vrEes295Jf72kI6SUfXDD7rAp+LoKe26WbvjANoTHFkYpG5Yu7nK9XQRVus0iAupqdXeogeAdq2xAdUVGNa7EoBZ3K1jK7/47NFY9b9zfPcjTkqKi/DNWSOx8idzUFWeHnKL6gYtFAYyGBsh+nJuccLMhglT4UQ4YXHd6JExH2xtxKm3vAwAGN23W6g2dLxa9LrQZkT7BDjVY+t6Ok8q024qXcuK8cSVM9CeYDy+NL28sTVvTHERobioGLlGURGhoqzY5Hbys2KWUPgEvu0T0WgiWmr4aySibxHRj4joE0P5mVF2OPfIbghE0qJXRN0E6IZuPafHdjPFobQkah+9m+sm+d8qVH5166Kpg3HxtCEuFn16ELq8pBhdy0pMTxxtbtnochiJmxeMBBZ6Zv6QmScw8wQAkwE0AXhE23yrvo2Zn4qio7lKtkPdmKHMRx9soRGz60aliVHNqExb9Ort3TS3Q8LGorc+vbxx3SmO7fWuKgcROd4gqruWAgCOG94rVWaMnoo6LDZujDfRbM88FnKbqBx5swB8xMwbIqovb8i+FLBylmeYqJvD2qCl6l4RVdSNNY7eymvXnoK3vz8rdSMoJsIfvlSf2m4V7L7duzi2xw43L53+1RV44ZoTcf2ZRxmOS2+3S/mbD0gEjmAkqm/DBQD+YXh/BREtJ6J7iKhnRG3kJNmepWiMoze6WoL0Qxfdhat2AFC7KqKLutHbVG/v0bUUfbt3SZ1HcRFh9pi+qe1Wt5KbayL9lOK837DaKpTYZNJsyzOL3kh5ae6NJQgdR+hfMRGVATgbwANa0R0AhgOYAGArgJttjptPRIuIaFFDQ0PYbnQaGOqwwCCSZNV1lQiXRBxeqbohGRceSRiE3ojfcWfdGPf7PGL8DGoqy3wenTuIRS8YieLbcAaA95h5OwAw83ZmbmfmBIA/AJiiOoiZ72Lmemaur62tjaAbHUO2bT6TRW9QsWk3LfRdl9WNonIJlUaWAsG+jZvmjjf0Kfk/rNDrvna/YZn6jWhYbSVmjsqv76XxcsosWcFIFEJ/IQxuGyLqZ9g2F8CKCNoQNOxmxja5TA5SYa1H9aQQ1aCe02CsceFt49q4RtxSAz/zLfMEocmDkx5D/zeIJDNH5pfIW9FdVguvORHPXz2zg3sjdDSh4uiJqCuA2QC+aij+BRFNQPI3s96yreDoiKibQMvi2dRlRHUDicp1k54wlW7j+atn4nCr2X+kb/YTXllRWowjj+huKtP9+34t+lSoaYEYxMNrqzq6C0IOEErombkJQC9L2cWheiQ4YnbdhFMjqwX/6pqdGftE5boxzrrVGdEnczKWvY/evh/PKSxWfX+7w4zpAoykonVyNM+NE9lKrCfkHzJiE5Kof1pj+3d33G503YSVIi9PBlFF3VRXJGPWjW4apz5Z4+hV95v75k3Fv781EwN7dgUA/P6LkzL2Ud0gRvWtwo/PHqtsv1KL5+9eIZPGhcJBvs0hiTq80s1IN1r0H2xtxK+fX40rTh4RqC0vqy5F5bqZf+IwVJQVZ6TWtaJ/nNaVrVSCPWNkb9N7VUZM1Q1i3oyhKUG38rnJA3GwuQ0XHzfEsZ+5iOSpF+wQiz4kUfnLdby4DIwul18/vwYzfv5ioLYSDPzUZWFyY/TG3ZfUZ2yfUldjel9lI6DlJcX4ygnDXG8cdq4bL6j88bUKF42dyAPJG9tXThiG8hKJQxcKBxH6gCzesAeX3PNO5NPk3fSNOdMSd1qT9qKpg223tScYf3RZ5tCYAmHWUX1R1yvpJqntlhTQz9abU/f20Fw0QbELr/SCan3bkuIi3HbhRFOZ3c0o39G/FefX51Y6ZaHjEaEPyFX/XIqXVzdg8+6maCt28d0kffTeq/tcvb2rxJOP3iapGVn+R0XKog8w0Gx3yNnHpBfo+NpJw3FCnodOunHG+H7uOwmdChH6gOgWZ6vXVac94iZve5pacevzq223TxlqdqU4pav1IvR2x+uiGvWyeikffYD4fS99uXbOkQWb2ZFt5iAIggh9QHSxaNjfHGm9bhr0aweRVx3v9KP3co+yGxRtbks+VpSXZH6Fbv7cMe4V+2wXAH567jjX4644eQQe+frxodvPR/TvZIHex4QQiNAHxG1hhw+2eFuM2oqbVeq2PF7XMrP/2Wlmq2qClKJDyuJGbZEVlU/+vMkD8d05ozN8435QZUf+4jT3SJhvnz4aEwcXdB49W8q0m24Qt5dQ2BTmqFQWcHv8P/O2VwPV62aNrdq233F7z67mRFxOFr2X0NBF63cry/V7hJ7T3crXT0qGfF75jyWubaiIWqx++4WJWLpxb6R15hp6IrOo3WlC/iNCH5C4/LxhZ2TWVJqF1+nJw4tFr7to7KiuMN9YosqNE/Xn+6mj++NTR/d33zGP0S36bKfOFnIfcd0EJMyA16CaitTr++ZNNW8MqW89Lal1nQTTi+emxUboLz95OMb0645+1eYFQCrLorEdxCr1T5kW+9+cxwumCPEgQh+QMIsv96osxxAtHt3qiw5ryHbrYrbonYR+9XZnNxCQucqSPoHqxFF98NQ3T0BpcREunjYEfbsn4+rDxqgv+Mx4DKutDFVHZ0V33djdnIXOiwh9QMK4FoyP1lZXTdjQOGsSMqcb0g8ff9+1vpa2BAbVVOA7p48GkB58Nbp9/vfccamc8pXl4WaUXjBlMF645qTU++/OGY2BPdNPQKP6VuHKU4KlfCh09AgoEXrBivjoAxLGF80wTDiyVBPWY2G9AYVNSvaNWSMwd2J6pqUu9I2HW037HWhuA+CcXiAIXz9pRGpgFwCeverESOsvJMpE6AUbxKIPSLEq/s8jCeZUdsaoPdHWcbiqLvbC28vDUnlGkQeAHtrg675DZqGfpIU0fmGKfcoFIV7O12ZB19d1zvBSwR4R+oCECS5JJJKLZQCZ6XinDu2lOsQzh9vMcfZOFv2EQdW+6z9v8gAAwETLsYNqumL9grNw/AhzRsmJg6vRv4d5wFaIh+OG98L6BWdhSC8Z4xDMiNAHJIyPPsGcik6xhjgOq63Exz87M3DdB5u9LylovSkAwFvfm+V4zPHDe2P9grMwsm/moiEqHvn6dLzhUqcgCPES2qFKROsB7AfQDqCNmeuJqAbAPwHUIbmc4PnMvCdsW7lE2DjvrtqgpWqma5jQwkMtbZ73bW7N9OWGHUwVBCH3iMqiP5mZJzCznrD8OgALmXkkgIXa+4IiTHRMghldtZWWnBb1PndCeoKP13BOr4uEnzS6VjkZyppCQRCE/Ccu1805AP6svf4zgHNjaqfDCCf0QEVpUlCbbCzwD35yOm4+fwIAoHdVOf5y6RRPdTe1poV+2Q9PAwA8fsX0jP0qSovRrHDdFGpmR0HozEQh9AzgWSJaTETztbK+zLwVALT/GWu8EdF8IlpERIsaGhoi6EZ2CRMGycyYMTI56Dq0t3rgrGtZCYqLCCt+fDpeu/Zkz0v6TRiYHiTtpoU6GkMeb5w7Du//+HR0KS3GYYXrRhCEwiOK5/TpzLyFiPoAeI6IVnk5iJnvAnAXANTX1+ddco4wFj1zMmxx6tBe6F9d4bivPtPUS3NvXHcK+vXogu8+tDzZR806LzPcJMqKi1BZXoIupcU42Ozdny8IQv4S2qJn5i3a/x0AHgEwBcB2IuoHANr/HWHbyTXCWPT6gh9uIm9qz8M+/asrlAO5xhBLve1BNRXYdbDFc/uCIOQvoYSeiCqJqJv+GsBpAFYAeBzAJdpulwB4LEw7uYjKovfq3rYmE3vjulMwfYRz/HyYG4txgW89dc0wG5eREbdQS0EQ8oOwFn1fAK8R0TIA7wB4kpmfAbAAwGwiWgNgtva+oFAJrz4Jyo57vpwMSrIu4de/uiKV7jeODLOlhlWg2rUGhvauythvgOUJ4wiZ6CQIBUEoHz0zrwOQsW4cM+8CUNDmoCpvfFERoe66J3HBseoFuUf2SU4yCibmwU36UkO6hnbNpB/SqyuI0n25aOrgVOIyQRAKC5kZGyG6aN7/7ibldv0pQLUwxKCaZNriGpv8M/qxQdIjG103bZrfqEtpMY42ROiM7d8D1V3dc98IgpB/yOyYgKjE2m1lH92vr9rr6tmjMGlwNaZbcsXo6FJdXEQpsfaKMTbe6DYa1LMCyzbt1frmq0pBEPIIsegD0q4QdTcB1oXe6qMHkilmTxt7hO2xejRNEIveGIljXEfEOKYgCzoJQuEiFr1Pzrn9dUwbVpMROXNsXU8s3uCczkfXaJ8GOQCzRR8GYy4bPQ0DEM8gsCAIuYFY9D5Ztmkv7nx5XYZVXl+XKf5WdMs6yOLNusUddi1VY774LgahD3LzEQQhPxChD4hVrL3IbziLnkx1AMD3zjjSdz3GVApG140x584z3zoBv7tokv9OCoKQk4jQByRh8HU/8Y0ZnlIiOPno3TBa9As+Mx7PXz0TX5w2xHc9RoxC32hYMerII7rjzPH9QtUtCELuUDBC39TShovvfhsf7zyYlfaMYj1uQA9Pg5m60IdZx5WQXEB7RJ9uvvz1t5x/DB647DhTWXXX0tTrxsOS90YQCpWCGYx9+cMGvLpmJxY8vRJ3XlzvfkBIrO4XL77zHl1LcfXsUYGsZZWP3u4p4vdfnJTRv89MGpixX6/K8tRru3TJgiDkPwUj9JRyi2SnPav7xatxfeWskYHa0330Rm23s+jnjPN2I+ndLS3035ZZsYJQsBSM60bXPF1/D7e2438eW4G9TfFkaLQKvSolgs7RA3vg1s9nZIrwRcqiN5SFneQ0fkAPXDR1MJ6/eib6dJO8NoJQqBSMRa+7MZ5fuR3LN+/FB1sa8Zc3NyDBjJ+eOz7y9vQnh5s/d4zWvv2+nz92EOZOzHSd+EEXeqO7JmyoZXER4ca50X82giDkFgVj0Rs17+zfvp6audoeky+HmTFpcDXOmzwwo/04ULluBEEQvFAwQh9mxacgJJhNbRYXxftRqix6QRAELxSE0O8+2IK/vLneVObkM4+C1nZOLdUHmDNExoFb7bddODHW9gVByF8KQujveGktXvxQvcB40BwuB5rb8Pe3N5pmwCYMbqB3Pt6NcsOCHmFi472QDq9Ubz/7mP6xti8IQv5SEIOx3bqUZpQF9XA8sXwLykuKcctzq7FyayPGD+iB8QN7AMjMWLlk497U67iFHqkUCOK6EQTBH4GFnogGAfgLgCMAJADcxcy/IaIfAfhvALqJ/X1mfipsR51wmiHqx6Jfu+MArvj7ElNZiWm9VXNlxhBLJ9fN9OHqHPN+sLPoe1SU4vM2K1oJgiAA4Sz6NgDXMPN72gLhi4noOW3brcz8q/DdC84rq9WuHCcOt7ZnlP3nk32oKi/BoJquGbHzXQy5YspKMi36SYOr8fDXp/vuhwqy/NdZ9sPTIqlfEITCJbDQM/NWAMDSYTAAAAmISURBVFu11/uJaCWAAVF1LCxPr9jm+5jNew5llH33weUAgL99ZSqOGVRt2tbFIO4liqibsHHuRvRbjLhuBEHwSySOZSKqAzARwNta0RVEtJyI7iGinjbHzCeiRUS0qKHBv/VtxCm/OysX7lNz2X2Lbbdd9Me38eKqHaYyo5CrXDdRSnLqHEXnBUHwSWihJ6IqAA8B+BYzNwK4A8BwABOQtPhvVh3HzHcxcz0z19fW1gZuf19TK9buOGC7vS3B+GBLY+D6jWzc3WR6b7zBlCpcN1Fa36LzgiAEJZTQE1EpkiL/N2Z+GACYeTsztzNzAsAfAEwJ3017ZvziBTy6dIvt9off+wRn3vYq1mzfbyrfsvcQGg+32hylxrpUoPFZoUwVdROhKovrRhCEoAQWekr6Le4GsJKZbzGUG1MnzgWwInj33NnvMY/6B1sbcaA5ue+m3U04fsELOOu2V3219YLFdWOOusn8KE8e3cdX/U7obYnOC4LglzBRN9MBXAzgP0S0VCv7PoALiWgCkkboegBfDdXDiPjm/UtR260cD3/teJzwixcBAJt2Zw6++sE4NKAK8bzsxGGh6le1FfeMX0EQCo8wUTevQe2ciDVmPgwN+5vxyd5w4g4AcycOwCNLPsHMUemxBdXCHVFG3YhFLwhCUPI6BYJTtI0de5vUfvn9Pvz1A3tW4OXvnIQb545LlVVXlAEArpk9ynefvJCy6EXpBUHwSV4LfWu7f6G3hlC2JxjNbe14d/1uz3U0tyUwpFclykvSE6bGD+yBJ74xA5efPMJ3n/wQdrERQRA6H3md66a5LXMmq19O/OWLyolSV506Crc+v1rdrmIGLZBcJDwuxHUjCEJQ8lzoE6HrUIk8AEwaUq0s99Luq989OSNdQliqypOXamSfbpHWKwhC4ZPXQt8SgdDbUVNZhvkzh+GuV9ZlbKs1LKqtYlBN18j7M6y2CvfNm4rJQ5QTjQVBEGzJax99FBa9HeUlxTh+eC/ltm+cMjK2dp2YMbI3KsqK3XcUBEEwkNdCr1v035wVvfB2KTV/ND/69BgAwIDqCmWmSkEQhFwlrxVLH4wdP6BHyodtpNLF+n3iGzNw37ypym3GiJoTRvbGSdos18ExuGUEQRDiJK+FvqayDJdOH4ohvbriuatn4qfnjjPFsT9w2fG4dPrQlAvm2Dqzf3vcgB6YMTK9KIhx3dUupUUpse9eUYq63pW4ce443H7RpDhPSRAEIXLyWugH9uyK//n0GIzs2w39elTgi9OG4BsGN86Y/t3xP58eg3MnJNPkD+lVqaynq2b5nznuCNRUJic+lZUUYdqwGnz/zCNx07njAQAXTR2S2i4IgpAv5HXUjR1/uXSKKSKne0VyTVlm4K/zpuDxpVswd2J6jZRHvj4dizbsRklxER687Di8srohZc3Pnzk8u50XBEGIGAqSRiBq6uvredGiRbHV39aewM3PrcZXZgxFryrn0EhBEIR8gYgWM3O9234FadFbKSkuwrVzjuzobgiCIHQIee2jFwRBENwRoRcEQShwROgFQRAKHBF6QRCEAic2oSeiOUT0IRGtJaLr4mpHEARBcCYWoSeiYgC3AzgDwBgk15EdE0dbgiAIgjNxWfRTAKxl5nXM3ALgfgDnxNSWIAiC4EBcQj8AwCbD+81aWQoimk9Ei4hoUUNDQ0zdEARBEOKaMKVa8M40BZeZ7wJwFwAQUQMRbQjRXm8AO0Mcn290tvMF5Jw7C3LO/hjiZae4hH4zgEGG9wMBbLHbmZlrwzRGRIu8TAMuFDrb+QJyzp0FOed4iMt18y6AkUQ0lIjKAFwA4PGY2hIEQRAciMWiZ+Y2IroCwL8BFAO4h5nfj6MtQRAEwZnYkpox81MAnoqrfgt3ZamdXKGznS8g59xZkHOOgZxIUywIgiDEh6RAEARBKHDyWugLNc0CEQ0ioheJaCURvU9E39TKa4joOSJao/3vqZUTEd2mfQ7LiSgvF7YlomIiWkJET2jvhxLR29r5/lMb2AcRlWvv12rb6zqy32EgomoiepCIVmnX+7hOcJ2v0r7XK4joH0TUpdCuNRHdQ0Q7iGiFocz3dSWiS7T91xDRJUH7k7dCX+BpFtoAXMPMRwGYBuBy7dyuA7CQmUcCWKi9B5KfwUjtbz6AO7Lf5Uj4JoCVhvc/B3Crdr57AMzTyucB2MPMIwDcqu2Xr/wGwDPMfCSAY5A8/4K9zkQ0AMCVAOqZeRySwRoXoPCu9b0A5ljKfF1XIqoB8EMAU5HMNvBD/ebgG2bOyz8AxwH4t+H99wB8r6P7FdO5PgZgNoAPAfTTyvoB+FB7fSeACw37p/bLlz8k51osBHAKgCeQnHS3E0CJ9XojGc11nPa6RNuPOvocApxzdwAfW/te4NdZnzVfo127JwCcXojXGkAdgBVBryuACwHcaSg37efnL28tenhIs1AIaI+qEwG8DaAvM28FAO1/H223Qvgsfg3guwD0Vd17AdjLzG3ae+M5pc5X275P2z/fGAagAcCfNJfVH4moEgV8nZn5EwC/ArARwFYkr91iFP61Bvxf18iudz4LvWuahXyHiKoAPATgW8zc6LSroixvPgsi+hSAHcy82Fis2JU9bMsnSgBMAnAHM08EcBDpx3kVeX/emuvhHABDAfQHUImk68JKoV1rJ+zOMbJzz2eh95VmId8golIkRf5vzPywVrydiPpp2/sB2KGV5/tnMR3A2US0HslMp6cgaeFXE5E+18N4Tqnz1bb3ALA7mx2OiM0ANjPz29r7B5EU/kK9zgBwKoCPmbmBmVsBPAzgeBT+tQb8X9fIrnc+C33BplkgIgJwN4CVzHyLYdPjAPSR90uQ9N3r5V/SRu+nAdinPyLmA8z8PWYeyMx1SF7HF5j5IgAvAvistpv1fPXP4bPa/nln5THzNgCbiGi0VjQLwAco0OussRHANCLqqn3P9XMu6Gut4fe6/hvAaUTUU3sSOk0r809HD1iEHOw4E8BqAB8BuL6j+xPhec1A8hFtOYCl2t+ZSPomFwJYo/2v0fYnJCOQPgLwHyQjGjr8PAKe+0kAntBeDwPwDoC1AB4AUK6Vd9Her9W2D+vofoc43wkAFmnX+lEAPQv9OgP4MYBVAFYA+CuA8kK71gD+geQYRCuSlvm8INcVwKXaua8F8F9B+yMzYwVBEAqcfHbdCIIgCB4QoRcEQShwROgFQRAKHBF6QRCEAkeEXhAEocARoRcEQShwROgFQRAKHBF6QRCEAuf/AzI7i1dreSleAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "policy_kwargs = {'hidden_sizes' : [10,], 'activation':tf.nn.relu,\n",
    "        'learning_rate':0.02}\n",
    "agent = OffPolicyVPGAgent(env, policy_kwargs=policy_kwargs)\n",
    "behavior_agent = RandomAgent(env)\n",
    "\n",
    "# 训练\n",
    "episodes = 1000\n",
    "episode_rewards = []\n",
    "for episode in range(episodes):\n",
    "    observation = env.reset()\n",
    "    episode_reward = 0.\n",
    "    while True:\n",
    "        action, behavior = behavior_agent.decide(observation)\n",
    "        next_observation, reward, done, _ = env.step(action)\n",
    "        episode_reward += reward\n",
    "        agent.learn(observation, action, behavior, reward, done)\n",
    "        if done:\n",
    "            break\n",
    "        observation = next_observation\n",
    "    \n",
    "    # 跟踪监控\n",
    "    episode_reward = play_montecarlo(env, agent, train=False)\n",
    "    episode_rewards.append(episode_reward)\n",
    "\n",
    "plt.plot(episode_rewards)\n",
    "\n",
    "# 测试\n",
    "episode_rewards = [play_montecarlo(env, agent, train=False)\n",
    "        for _ in range(100)]\n",
    "print('平均回合奖励 = {} / {} = {}'.format(sum(episode_rewards),\n",
    "        len(episode_rewards), np.mean(episode_rewards)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "S73sbPKggy-p"
   },
   "source": [
    "带基线的重要性采样策略梯度算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 283
    },
    "colab_type": "code",
    "id": "NR3MrA_lgy-q",
    "outputId": "8e48e7f2-0ddc-470a-de16-a0eab9c42606"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "平均回合奖励 = 20000.0 / 100 = 200.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "policy_kwargs = {'hidden_sizes' : [10,], 'activation':tf.nn.relu,\n",
    "        'learning_rate':0.02}\n",
    "baseline_kwargs = {'hidden_sizes' : [10,], 'activation':tf.nn.relu,\n",
    "        'learning_rate':0.03}\n",
    "agent = OffPolicyVPGAgent(env, policy_kwargs=policy_kwargs,\n",
    "        baseline_kwargs=baseline_kwargs)\n",
    "behavior_agent = RandomAgent(env)\n",
    "\n",
    "# 训练\n",
    "episodes = 800\n",
    "episode_rewards = []\n",
    "for episode in range(episodes):\n",
    "    observation = env.reset()\n",
    "    episode_reward = 0.\n",
    "    while True:\n",
    "        action, behavior = behavior_agent.decide(observation)\n",
    "        next_observation, reward, done, _ = env.step(action)\n",
    "        episode_reward += reward\n",
    "        agent.learn(observation, action, behavior, reward, done)\n",
    "        if done:\n",
    "            break\n",
    "        observation = next_observation\n",
    "    \n",
    "    # 跟踪监控\n",
    "    episode_reward = play_montecarlo(env, agent, train=False)\n",
    "    episode_rewards.append(episode_reward)\n",
    "\n",
    "plt.plot(episode_rewards)\n",
    "\n",
    "# 测试\n",
    "episode_rewards = [play_montecarlo(env, agent, train=False)\n",
    "        for _ in range(100)]\n",
    "print('平均回合奖励 = {} / {} = {}'.format(sum(episode_rewards),\n",
    "        len(episode_rewards), np.mean(episode_rewards)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "ywujXzawzmUo"
   },
   "outputs": [],
   "source": [
    "env.close()"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "CartPole_v0.VPG.20190130245.explore.ipynb",
   "provenance": [],
   "version": "0.3.2"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
